package com.atguigu.lease.web.admin.controller.apartment;


import com.atguigu.lease.common.result.Result;
import com.atguigu.lease.model.entity.AttrKey;
import com.atguigu.lease.model.entity.AttrValue;
import com.atguigu.lease.web.admin.service.AttrKeyService;
import com.atguigu.lease.web.admin.service.AttrValueService;
import com.atguigu.lease.web.admin.vo.attr.AttrKeyVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

//attribute
@Tag(name = "房间属性管理")
@RestController
@RequestMapping("/admin/attr")
public class AttrController {

    @Autowired
    private AttrKeyService attrKeyService;

    @Autowired
    private AttrValueService attrValueService;


/*
    1.在FeeKey加@TableFiled(exist=false)List<FeeValue>属性
        或者封装FeeKeyVo类(推荐)
    2.SQL语句
        2.1 逻辑模型,如果是[1,1]~[1,n],可以用内连接,其余只要有0就必须用外连接
        2.2 SQL的从表的逻辑删除用on而不是最后放where里,因为外连接查询,
            子表的条件筛选会去除外连接的特性(where里,相当于两个逻辑删除字段均为0才会保留,
            这会将主表为0但没匹配到从表的记录给过滤掉)
            where是在 查询结果最终表 的基础上去筛选
            on是在两个单表基础上筛选,然后将两个筛选后的单表做内外连接(内连接是两个表都筛选,外连接是对从表筛选)
        2.3 条件放哪都行的话,放在on性能好,无论内外连接
    3.删除被关联的数据三种方案(比如学生和分数表,要删除学生数据)
        3.1 直接单表删除 删除学生信息 【不推荐】
        弊端：1.表有主外键关系，外键有关联数据，数据库不会删除
             2.数据库中产生`孤儿数据` [没有主表关联的子表数据] 垃圾和冗余数据,需要定时任务定期删除

        3.2 删除关联信息 删除学生和学生的分数 [推荐，非重要数据使用]
           删除学生之前，先删除学生的分数！再删除学生数据！
           优势： 1. 避免主外键关系 2. 避免孤儿数据

        3.3 先查询关联数据，如果有，给与提示（确认），不会直接删除 [推荐：重要数据使用]
           给与用户提示，是否一并删除或者取消,如果确定执行第二种删除逻辑
           或者不允许删除,让其先删除关联数据

*/
    @Operation(summary = "查询全部属性名称和属性值列表")
    @GetMapping("list")
    public Result listAttrInfo() {
        List<AttrKeyVo> list = attrKeyService.listAttrInfo();
        return Result.ok(list);
    }


    @Operation(summary = "新增或更新属性名称")
    @PostMapping("key/saveOrUpdate")
    public Result saveOrUpdateAttrKey(@RequestBody AttrKey attrKey) {
        attrKeyService.saveOrUpdate(attrKey);
        return Result.ok();
    }

    @Operation(summary = "新增或更新属性值")
    @PostMapping("value/saveOrUpdate")
    public Result saveOrUpdateAttrValue(@RequestBody AttrValue attrValue) {
        attrValueService.saveOrUpdate(attrValue);
        return Result.ok();
    }

    @Operation(summary = "根据id删除属性名称")
    @DeleteMapping("key/deleteById")
    public Result removeAttrKeyById(@RequestParam Long attrKeyId) {

        //先删除属性Value
        LambdaQueryWrapper<AttrValue> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AttrValue::getAttrKeyId, attrKeyId);
        attrValueService.remove(wrapper);

        //再删除属性key
        attrKeyService.removeById(attrKeyId);

        //这里不能对value加判断返回值,因为有可能这个属性没有对应的值,这样改变行数就是0,方法返回false
        //可以对key加判断返回值
        return Result.ok();
    }

    @Operation(summary = "根据id删除属性值")
    @DeleteMapping("value/deleteById")
    public Result removeAttrValueById(@RequestParam Long id) {
        attrValueService.removeById(id);
        return Result.ok();
    }

}
